import { userStore } from "@/store/modules/user.js";
import { close, start } from "@/utils/nprogress.js";
import router from "../router/index.js";
import { message } from "ant-design-vue";

const modules = import.meta.glob("../pages/**/**/*.vue");
const whiteList = ["/login", "/register"];
let hasFsyncRoute = false;

// 处理菜单路由
const handleMenu = (Menus) => {
  try {
    Menus.forEach((item) => {
      let url = `../pages/${item.component}`;
      const route = {
        path: item.path,
        name: item.name,
        component: modules[url],
        children: [],
      };
      router.addRoute("layout", route);
    });
    hasFsyncRoute = true; // 更新标志
  } catch (error) {
    hasFsyncRoute = false;
    console.error("路由同步失败", error);
  }
};

// 获取菜单（异步）
const getMenu = async () => {
  try {
    const user = userStore();
    if (user.routerResult.length > 0) {
      return user.routerResult;
    }
    return await user.GetMenu();
  } catch (error) {
    message.error("菜单加载失败，请重试");
    throw error;
  }
};

// 是否需要重定向
const needsRedirectToLogin = (to) => !whiteList.includes(to.path);

// 路由守卫
router.beforeEach(async (to, from, next) => {
  start(); // 开始进度条
  const user = userStore();
  const token = user.token;

  if (token) {
    // 如果没有同步路由，异步加载
    if (!hasFsyncRoute) {
      try {
        const menus = await getMenu();
        handleMenu(menus);
        return next(to.fullPath); // 加载完菜单后重新进入目标路径
      } catch (error) {
        return next("/login"); // 加载失败时跳转到登录页
      }
    } else {
      next(); // 路由已同步直接跳转
    }
  } else {
    // 没有 token 时，判断是否在白名单内
    if (needsRedirectToLogin(to)) {
      return next("/login"); // 需要登录时重定向到登录页
    }
    next(); // 白名单路径直接进入
    NProgress.done(); // 完成进度条
  }
});

router.afterEach(() => {
  close(); // 关闭进度条
});
